#ifndef	ACL_ITERATOR_INCLUDE_H
#define	ACL_ITERATOR_INCLUDE_H

typedef struct ACL_ITER ACL_ITER;

/**
 * ACL 库中数据结构用的通用迭代器结构定义
 */
struct ACL_ITER {
	void *ptr;		    // 迭代器指针, 与容器相关, ptr与data均指向了结果集当前遍历到数据
	void *data;		    // 用户数据指针
	int   dlen;		    // 用户数据长度, 实现者可设置此值也可不设置

	const char *key;	// 若为哈希表的迭代器, 则为哈希键值地址
	int   klen;		    // 若为ACL_BINHASH迭代器, 则为键长度

	int   i;		    // 当前迭代器在容器中的位置索引, 范围[1-size]
	int   size;		    // 当前容器中元素总个数
};

/**
 * 正向遍历容器中元素
 * @param iter {ACL_ITER}
 * @param container {void*} 容器地址
 * @examples: samples/iterator/
 */
#define	ACL_FOREACH(iter, container)  \
        for ((container)->iter_head(&(iter), (container));  \
             (iter).ptr;  \
             (container)->iter_next(&(iter), (container)))

/**
 * 反向遍历容器中元素
 * @param iter {ACL_ITER}
 * @param container {void*} 容器地址
 * @examples: samples/iterator/
 */
#define	ACL_FOREACH_REVERSE(iter, container)  \
        for ((container)->iter_tail(&(iter), (container));  \
             (iter).ptr;  \
             (container)->iter_prev(&(iter), (container)))

/**
 * 获得当前迭代指针与某容器关联的成员结构类型对象, 即取出iter->ptr使用
 * @param iter {ACL_ITER}
 * @param container {void*} 容器地址
 */
#define	ACL_ITER_INFO(iter, container)  \
	(container)->iter_info(&(iter), (container))

#define	acl_foreach_reverse	ACL_FOREACH_REVERSE
#define	acl_foreach		    ACL_FOREACH
#define	acl_iter_info		ACL_ITER_INFO

#endif
